#pragma once
#include "../core.h"

namespace qb{
	namespace base{
		// MemoryPage可能有不同长度的,单个MemoryPage必须能容纳bytes
		// MemoryPage不能是等长的
		// 但是MemoryPage都是按照4kb对齐的,大小都是4kb的整数倍
		class MemoryPage;
		class CentralAllocator;
		class MemoryPageList;
		class S_CORE_EXPORT PageAllocator{
			// 此类只用在单独线程中,不考虑多线程问题
		public:
			typedef void* RootPtrType;
		protected:
			friend class CentralAllocator;
			RootPtrType				m_root;		// 是否有拥有者
			bool					m_inmsg;	// 仅做调试用,true表示m_root位于Message内
			bool					m_force_free;	// 
			MemoryPageList*			m_pagelist;	// 历史内存页面
			MemoryPage*				m_current;	// 当前的内存页
			CentralAllocator*		m_central;	// 仅仅用于调试查看
			double					m_alloc_time;	//
		protected:
			PageAllocator(RootPtrType root, bool inMessage);
			~PageAllocator();
		public:
			static PageAllocator* CreateWithRoot(RootPtrType root, bool inMessage);
			static void Destroy(PageAllocator* allocator);
			static void SwapRoot(PageAllocator* dest, PageAllocator* source);

			const RootPtrType GetRoot()const{ return m_root; }
			bool IsInMessage()const{ return m_inmsg; }
			int GetBytes()const;

			void* AllocMemory(int bytes);
		};
	}//base
}//ss